package com.day17;

import com.day06.Person;
import org.junit.Test;

import java.util.Iterator;
import java.util.List;

/**
 * 1.泛型在继承方面的体现
 *
 *
 *
 *
 * 2.通配符的使用
 *
 *  有限制条件的通配符
 *  通配符指定上限
 *  上限extends:使用时指定的类型必须是继承某个类，或者实现某个接口，即<=
 *  通配符指定下限
 *  下限super:使用时指定的类型不能小于操作的类，即>=
 *
 *  举例:
 *      <? extends Number>无穷小
 *      只允许泛型为Number及Number子类的引用调用
 *
 *      <? super Number>无穷大
 *      只允许泛型为Number及Number父类的引用调用
 *
 *      <? extends Comparable>
 *      只允许泛型为实现Comparable接口的实现类的引用调用
 *
 *
 *
 *
 */
public class GenericExtendsTest {

    /**
     * 1.泛型在继承方面的体现
     *
     * 类A是类B的父类,G<A> 和 G<B>不具备子父类关系，二者是并列关系。
     * 补充:
     *      类A是类B的父类，A<G>和B<G>是继承关系
     *
     *
     */

    @Test
    public void test1(){

        Object obj = null;

        String str = null;

        obj = str;

        Object[] arr1 = null;
        Object[] arr2 = null;
        arr1 = arr2;



        List<Object> list1 = null;
        List<String> list2 = null;

        //此时的List1和list2的类型不具有子父类关系
//        list1 = list2;

        /**
         * 反证法:
         * 假设list1 = list2
         */
    }

    /**
     * 通配符的使用
     * 通配符:?
     *
     * 类A是类B的父类，G<A>和G<B>是没有关系的，二者共同的父类是G<?>
     *
     * 对于List<?>不能像其中添加数据,除了添加null之外,因为null是所有类对象的默认值。
     *
     */

    @Test
    public void test2(){
        List<Object> list = null;
        List<String> list1 = null;

        List<?> list2 = null;

        /**
         * 相当于List<?>是List<Object>和List<String>的通用父类
         */
        list2 = list;
        list2 = list1;

        print(list);
        print(list2);


    }

    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }

    @Test
    public void test3(){
        List<? extends Person> list = null;
        List<? super Person> list1 = null;
    }


}
